use regex::Regex; // 引入正则表达式库
// 将任意进制（2-16）字符串转换为10进制整数
fn from_base_to_decimal(input: &str, base: u32) -> u32 {
    let mut result = 0;
    let input = input.trim(); // 去除前后空格

    // 处理输入字符串的每个字符
    for (i, c) in input.chars().rev().enumerate() {
        let value = match c {
            '0'..='9' => c.to_digit(10).unwrap(), // 数字字符
            'a'..='f' => c.to_digit(16).unwrap(), // 小写字母字符
            'A'..='F' => c.to_digit(16).unwrap(), // 大写字母字符
            _ => panic!("Invalid character in the input"), // 非法字符
        };
        result += value * base.pow(i as u32); // 加权和如 12(10)=1*10^0+2*10^1
    }

    result
}

// 将10进制数转换为目标进制（2-16）
fn from_decimal_to_base(mut decimal: u32, base: u32) -> String {
    if decimal == 0 {
        return "0".to_string();
    }

    let mut result = String::new();

    // 通过取余运算得到目标进制的每一位
    while decimal > 0 {
        let remainder = decimal % base;
        decimal /= base;

        // 根据余数选择对应的字符
        let digit = if remainder < 10 {
            (b'0' + remainder as u8) as char
        } else {
            (b'a' + (remainder - 10) as u8) as char
        };
        result.push(digit);
    }

    result.chars().rev().collect() // 反转结果字符串
}

// 主函数：支持从任意进制转换为目标进制
pub fn convert_base(num_str: &str, to_base: u32) -> String {
    // 使用正则表达式提取数字和源进制
    let re = Regex::new(r"([0-9a-fA-F]+)\((\d+)\)").unwrap();
    //([0-9a-fA-F]+)：匹配一个由十六进制数字或字母组成的字符串，并将其捕获到第一个捕获组()。
    //(\d+)：匹配一个由数字组成的字符串，并将其捕获到第二个捕获组()。
    if let Some(caps) = re.captures(num_str) {
        let number_str = &caps[1]; // 提取数值部分
        let from_base: u32 = caps[2].parse().unwrap(); // 提取源进制

        // 将num_str从源进制转换为10进制
        let decimal_value = from_base_to_decimal(number_str, from_base);

        // 再将10进制数转换为目标进制数
        return from_decimal_to_base(decimal_value, to_base);
    } else {
        panic!("Invalid input format, expected 'number(base)'");
    }
}